package demo.hms.user.service.serviceImpl;

import demo.hms.entity.User;
import demo.hms.util.UserResult;
import demo.hms.user.dao.UserDao;
import demo.hms.user.service.UserService;
import demo.hms.util.Result;
import demo.hms.util.ResultSubmit;
import demo.hms.util.Toekn;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    @Override
    public Result select(String userId){
        User user = userDao.select(userId);
        if(user != null){
            return ResultSubmit.success(userDao .select(userId));

        }else {
            return ResultSubmit.error("未查询到该用户");
        }
    }

    @Override
    public Result login(String userId, String password, HttpServletRequest request){
        // 捕获空异常（未查询到指定用户ID的用户）、其他异常（服务器出错）
        try {
            // 查询指定userId的用户信息
            User user = userDao.select(userId);
            // 判断密码是否正确
            if(password.equals(user.getUserPassword())){
                // 密码正确时经过返回类包装输出数据
                HttpSession session = request.getSession();
                session.setAttribute("userId",user.getUserId().toString());
                session.setAttribute("userPassword",user.getUserPassword());
                session.setAttribute("userName",user.getUserName());
                session.setAttribute("roleName",user.getRoleName());
                Long time = System.currentTimeMillis();
                session.setAttribute("time",time);
                session.setAttribute("token",Toekn.getToken(String.valueOf(user.getUserId()),
                        user.getUserPassword(),user.getRoleName(),time));
                return ResultSubmit.success(re(user));
            }else {
                // 密码错误时返回密码错误
                return ResultSubmit.error("密码错误");
            }
        }catch (Exception e){
            // 当捕获空异常时，代表未查询到该用户，返回账户未注册，通过反射获取文件类型进行判断
            if(e.getClass() == NullPointerException.class){
                return ResultSubmit.error("登录失败，账户未注册");
            }else {
                // 不是空异常时，返回服务器错误
                return ResultSubmit.fail();
            }
        }
    }
    private UserResult re(User user){
        UserResult result = new UserResult();
        result.setUserId(user.getUserId());
        result.setUserName(user.getUserName());
        result.setRoleName(user.getRoleName());
        return result;
    }

    @Override
    public Result info(HttpServletRequest request){
        HttpSession session = request.getSession();
        Map<String,String> map = new HashMap<>();
        map.put("userId", (String) session.getAttribute("userId"));
        map.put("userName", session.getAttribute("userName").toString());
        map.put("roleName", (String) session.getAttribute("roleName"));
        // todo 系统记录
        return ResultSubmit.success(map);
    }

    @Override
    public Result selectAllUser(String 用户ID,String 用户名称,String 角色名称){
//        return ResultSubmit.success(
//                userDao.selectAllUser(
//                        userId, userName, roleName));
        List<User> 用户数据列表 =
                userDao.selectAllUser(用户ID, 用户名称, 角色名称);
        return ResultSubmit.success(用户数据列表);

    }

    @Override
    public Result insert(User user){
        user.setRoleId(2);
        user.setDeleteIdentity("未删除");
        user.setUserId(Math.abs((int)System.currentTimeMillis()));
        user.setCreateTime(format.format(new Date()));
        int i = userDao.insert(user);
        // todo 系统记录新增
        if(i == 1){
            return  ResultSubmit.success("插入成功");
        }else {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.error("插入失败");
        }
    }


    // 修改方法:
    // 逻辑删除旧数据
    // 修改传入新数据中的信息(创建时间,删除标识,主键)
    // 新增新数据
    // todo 加上系统记录操作
    // 根据删除和新增方法的返回数据判断是否执行成功
    // 成功则返回修改成功,不成功则返回修改失败并回滚
    @Override
    public  Result update(User user){
        int i = userDao.update(user);
        user.setUserTableId(null);
        user.setCreateTime(format.format(new Date()));
        user.setDeleteIdentity("未删除");
        int j = userDao.insert(user);
        // todo 系统记录新增
        if(i == 1 || j == 1 ){
            return  ResultSubmit.success("修改成功");
        }else {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.error("修改失败");
        }
    }

    // 删除方法
    // 根据userId查询用户信息
    // 执行逻辑删除
    // todo 加上系统记录操作
    // 根据逻辑删除返回结果判断是否删除成功
    // 如果成功则返回删除成功,如果失败则返回删除失败并回滚
    @Override
    public Result delete(String userId){
        User user = userDao.select(userId);
        int i = userDao.update(user);
        // todo 系统记录新增
        if(i == 1){
            return  ResultSubmit.success("删除成功");
        }else {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.error("删除失败");
        }
    }
}

















